package core.thread;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/**La clase mail adjunto hereda de Mail y sirve parab enviar los email con un atributo adjunto.
 * @author alvarogarcia
 *
 */
public class MailAdjunto extends Mail {

	protected static final int PLAIN_MESSAGE = 0;
	protected static final int OK_CANCEL_OPTION = 0;
	private String Ruta, nombreArchivo;
	Thread t;

	/**
	 * Constructor sin parametros
	 */
	public MailAdjunto() {
		super();
		DeclararHilo();
	}

	/**Constructor con parametros
	 * @param Destinatario Recibe el destinatario del email
	 * @param Asunto Recibe el asunto del email
	 * @param Texto Recibe el texto del email
	 * @param Ruta Recibe la ruta del archivo adjunto
	 * @param nombreArchivo Recibe el nombre que se le dara a ese archivo adjunto
	 */
	public MailAdjunto(String Destinatario, String Asunto, String Texto,
			String Ruta, String nombreArchivo) {
		super(Destinatario, Asunto, Texto);
		this.Ruta = Ruta;
		this.nombreArchivo = nombreArchivo;
		DeclararHilo();
	}

	/**Metodo que declara el hilo para luego poder inicializarlo
	 * 
	 */
	public void DeclararHilo() {
		t = new Thread(new Runnable() {
			public void run() {
				BodyPart texto = new MimeBodyPart();
				BodyPart adjunto = new MimeBodyPart();
				MimeMultipart partesJuntas = new MimeMultipart();

				try {

					Session session = crearSesion();
					// Sacar por pantalla los detalles del envio.
					session.setDebug(true);

					// Construccion del mensaje
					mensaje1 = new MimeMessage(session);

					adjunto.setDataHandler(new DataHandler(new FileDataSource(
							Ruta)));
					adjunto.setFileName(nombreArchivo);
					texto.setText(mensaje);
					partesJuntas.addBodyPart(adjunto);
					partesJuntas.addBodyPart(texto);

					// Se define la direccion de quien manda el email
					mensaje1.setFrom(new InternetAddress(
							"listadelacompramaker@gmail.com"));
					// Se define el receptor del email. En este caso es tipo TO
					/*
					 * Message.RecipientType.TO Destinatario principal del
					 * mensaje Message.RecipientType.CC Destinatario al que se
					 * envía copia del mensaje Message.RecipientType.BCC
					 * Destinatario al que se envía copia, pero sin que los
					 * demás destinatarios puedan verlo.
					 */
					mensaje1.addRecipient(Message.RecipientType.TO,
							new InternetAddress(destinatario));
					// Se define el asunto del email
					mensaje1.setSubject(asunto);
					// Se define el texto del email, en este caso en forma de
					// texto
					// plano.
					mensaje1.setContent(partesJuntas);

					// Lo enviamos.
					Transport t = session.getTransport("smtp");
					// Creamos la conexion con nuestro usuario y contraseña de
					// la cuenta
					t.connect("listadelacompramaker@gmail.com", "laboratorio50");
					// Se manda el mensaje pasando el mensaje que hemos creado
					// antes y
					// pasando un array de receptores que le sacamos del
					// mensaje.
					t.sendMessage(mensaje1, mensaje1.getAllRecipients());

					// Cierre de la sesion.
					t.close();
					Icon icono = new ImageIcon("src/GUI/resources/email.png");
					JOptionPane.showOptionDialog(
							null,
							"Se ha envidado un email a la direccion:  "
									+ destinatario, "Mensaje enviado",
							OK_CANCEL_OPTION, PLAIN_MESSAGE, icono,
							new Object[] { "ACEPTAR" }, null);
					
					
				} catch (Exception e) {
					Icon icono = new ImageIcon("src/GUI/resources/error.gif");	
					
					JOptionPane.showOptionDialog(null, "Error en el envio",
							"Error al enviar el email a la direccion : "+destinatario+"\n\n Revise su conexion e intentelo mas adelante", OK_CANCEL_OPTION, PLAIN_MESSAGE, icono,
							new Object[] { "ACEPTAR" }, null);
				}
			}
		});
	}

	/**
	 * Metodo que sirve para arrancar el hilo.
	 */
	public void arrancarHilo() {
		t.start();
	}

	/* (non-Javadoc)
	 * @see core.thread.Mail#crearSesion()
	 */
	public Session crearSesion() {
		// Se crean las propiedades de la conexión mediante la clase
		// Properties.
		Properties propiedades = new Properties();
		// Se define el servidor de correo
		propiedades.setProperty("mail.smtp.host", "smtp.gmail.com");
		propiedades.setProperty("mail.smtp.starttls.enable", "true");
		// Se define el puerto que se va a usar
		propiedades.setProperty("mail.smtp.port", "587");
		// Se define la cuenta de correo que vamos a usar
		propiedades.setProperty("mail.smtp.user",
				"listadelacompramaker@gmail.com");
		// Se declara que la cuenta de correo tiene contraseña
		propiedades.setProperty("mail.smtp.auth", "true");

		// Se prepara la sesion con las propiedades que hemos definido
		// antes.
		Session session = Session.getDefaultInstance(propiedades);
		// Sacar por pantalla los detalles del envio.
		return session;
	}

	/**
	 * @return Metodo que devuelve la ruta del archivo
	 */
	public String getRuta() {
		return Ruta;
	}

	/**Metodo que da valor a la ruta del archivo
	 * @param ruta Recibe un string que sera la ruta del archivo adjunto
	 */
	public void setRuta(String ruta) {
		Ruta = ruta;
	}

	/**Getter de nombreArchivo
	 * @return el nombre del archivo
	 */
	public String getNombreArchivo() {
		return nombreArchivo;
	}

	/** Setter de nombre de archivo
	 * @param nombreArchivo Recibe como parametro un String que se le asigna al nombre del archivo.
	 */
	public void setNombreArchivo(String nombreArchivo) {
		this.nombreArchivo = nombreArchivo;
	}
	
	/**Pequeño main de prueba de la consitencia de la clase
	 * @param args
	 */
	public static void main(String [] args)
	{
		MailAdjunto mail=new MailAdjunto("alvaro.garcia@opendeusto.es", "Lista PDF", "", "/Users/alvarogarcia/Desktop/aaa.pdf", "lista.pdf");
		mail.arrancarHilo();
	}
}
